package com.platform.core.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class RabbitConfig{

    @Autowired
    private CachingConnectionFactory connectionFactory;


    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(converter());

//        // 在配置类中或者适当的位置启用publisher confirms
//        connectionFactory.setPublisherConfirms(true);
//        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//
//            @Override
//            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//                if (ack) {
//                    // 消息已成功发送到RabbitMQ
//                    System.out.println("消息发送成功: " + correlationData);
//                } else {
//                    // 消息发送失败
//                    System.err.println("消息发送失败: " + cause);
//                }
//            }
//        });

        // 消息是否成功发送到Exchange
        rabbitTemplate.setConfirmCallback((correlationData, ack,cause)->{
            log.info("================================ack:"+ack);
           if(ack) {
                log.info("消息成功发送到Exchange");
                String msgId = correlationData.getId();
                log.info("消息成功发送到Exchange："+msgId);
           } else {
                log.info("消息发送到Exchange失败, {}, cause: {}",correlationData,cause);
           }
        });

        // 触发setReturnCallback回调必须设置mandatory=true, 否则Exchange没有找到Queue就会丢弃掉消息, 而不会触发回调
        rabbitTemplate.setMandatory(true);
        // 消息是否从Exchange路由到Queue, 注意: 这是一个失败回调, 只有消息从Exchange路由到Queue失败才会回调这个方法
        rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey)->{
           log.info("消息从Exchange路由到Queue失败: exchange: {}, route: {}, replyCode: {}, replyText: {}, message: {}", exchange, routingKey, replyCode, replyText, message);
        });
        return rabbitTemplate;
    }
    @Bean
    public Jackson2JsonMessageConverter converter(){
       return new Jackson2JsonMessageConverter();
    }

}
